#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#include "construtorIndice.h"
#include "ordenacao.h"

void inicializarLista() {
  inicioListaInscricao = NULL;
  inicioListaNome = NULL;
  inicioListaInvertida = NULL;
  finalListaInvertida = NULL;  
}

ChaveSecundaria* inserirChaveSecundariaNomeLista(RegAluno reg) {
	
	ListaChaveSecundariaNome *novaChaveSegundaria, *chaveSecundariaAtual, *chaveSecundariaAnterior;		
	
	novaChaveSegundaria = (ListaChaveSecundariaNome *) malloc(sizeof(ListaChaveSecundariaNome));	
	novaChaveSegundaria->chaveSecundaria.nomeOuCurso = malloc(strlen(reg.nome)+1);
	
	stpcpy(novaChaveSegundaria->chaveSecundaria.nomeOuCurso,reg.nome);
	novaChaveSegundaria->chaveSecundaria.ref = NULL;
	novaChaveSegundaria->proximo = NULL;
	
	if (inicioListaNome == NULL) {
		inicioListaNome = novaChaveSegundaria;
		return &novaChaveSegundaria->chaveSecundaria;
	}
	
	chaveSecundariaAtual = inicioListaNome;
	
	if (strcmp(chaveSecundariaAtual->chaveSecundaria.nomeOuCurso,novaChaveSegundaria->chaveSecundaria.nomeOuCurso) >= 0){
		novaChaveSegundaria -> proximo = inicioListaNome;
		inicioListaNome = novaChaveSegundaria;
		return &novaChaveSegundaria->chaveSecundaria;
	}
	
	while (chaveSecundariaAtual != NULL) {
	    	if (strcmp(chaveSecundariaAtual->chaveSecundaria.nomeOuCurso, novaChaveSegundaria->chaveSecundaria.nomeOuCurso) < 0){
			chaveSecundariaAnterior = chaveSecundariaAtual;
			chaveSecundariaAtual = chaveSecundariaAtual -> proximo;
		}else {
			chaveSecundariaAtual = NULL;
		}		
	}
	
	novaChaveSegundaria -> proximo = chaveSecundariaAnterior -> proximo;
	chaveSecundariaAnterior -> proximo = novaChaveSegundaria;
	
	return &novaChaveSegundaria->chaveSecundaria;
}

ChaveSecundaria *buscaChaveSecundariaNome(const char* nome){

    ListaChaveSecundariaNome *chaveSecundariaAtual;
    chaveSecundariaAtual = inicioListaNome;   
    
    while(chaveSecundariaAtual != NULL){
      if(strcmp(chaveSecundariaAtual->chaveSecundaria.nomeOuCurso, nome) == 0){
	return &chaveSecundariaAtual->chaveSecundaria;
      }else{
	chaveSecundariaAtual = chaveSecundariaAtual->proximo;
      }
    }   
    return NULL;
}

void inserirListaInvertida(ChaveSecundaria *chaveSecundaria, RegAluno reg){
  ListaInvertida *novoElementoListaInvertida;
  
  novoElementoListaInvertida = (ListaInvertida *) malloc(sizeof(ListaInvertida));
  novoElementoListaInvertida->elemento.inscricao = reg.inscricao;
  novoElementoListaInvertida->elemento.proxNome = chaveSecundaria->ref;    
  chaveSecundaria->ref = &novoElementoListaInvertida->elemento;
    
  novoElementoListaInvertida->proximo = NULL;
  
  if(inicioListaInvertida == NULL){
    inicioListaInvertida = novoElementoListaInvertida;    
  }else{
    finalListaInvertida->proximo = novoElementoListaInvertida;    
  }
  
  finalListaInvertida = novoElementoListaInvertida;
    
  
}

void inserirChavePrimariaLista(ChavePrimaria chavePrimaria){
  
	ListaChavePrimaria *novaChavePrimaria, *chavePrimariaAtual, *chavePrimariaAnterior;		
	
	novaChavePrimaria = (ListaChavePrimaria *) malloc(sizeof(ListaChavePrimaria));	
	novaChavePrimaria->chavePrimaria.inscricao = chavePrimaria.inscricao;	
	novaChavePrimaria->chavePrimaria.byteOffset = chavePrimaria.byteOffset;
	novaChavePrimaria->proximo = NULL;
	
	if (inicioListaInscricao == NULL) {
		inicioListaInscricao = novaChavePrimaria;
		return;
	}
	
	chavePrimariaAtual = inicioListaInscricao;
	if(chavePrimariaAtual->chavePrimaria.inscricao >= novaChavePrimaria->chavePrimaria.inscricao){
	  novaChavePrimaria->proximo = inicioListaInscricao;
	  inicioListaInscricao = novaChavePrimaria;
	  return;	  
	}
	
	while(chavePrimariaAtual != NULL){
	  if(chavePrimariaAtual->chavePrimaria.inscricao < novaChavePrimaria->chavePrimaria.inscricao){
	    chavePrimariaAnterior = chavePrimariaAtual;
	    chavePrimariaAtual = chavePrimariaAtual->proximo;	    
	  }else{
	    chavePrimariaAtual = NULL;
	  }
	}
		
	novaChavePrimaria -> proximo = chavePrimariaAnterior -> proximo;
	chavePrimariaAnterior -> proximo = novaChavePrimaria;	
  
}



/*ChaveSegundaria ordenaChaveSecundaria(){
  
  ChaveSegundaria chaveSecundaria;  
  ListaChaveSecundaria *p;
  
  if(inicio == NULL){
    return chaveSecundaria;
  }
  p = inicio;
  while(p != NULL){
    chaveSecundaria.nomeOuCurso = p->chaveSecundaria.nomeOuCurso;
    chaveSecundaria.inscricao = p->chaveSecundaria.inscricao;
    p = p->proximo;    
  }
  return chaveSecundaria;  
}*/

